/**
 三指针
 * @param {number[]} nums
 * @return {number[][]}
 */
export var threeSum = function (nums) {
  nums.sort((a, b) => a - b)
  const ans = []
  // a, b, c三个指针
  for (let a = 0; a < nums.length - 2; a++) {
    // 如果 nums[a] 和一个数相同。跳过以避免重复
    if (a > 0 && nums[a] === nums[a - 1]) continue
    let c = nums.length - 1
    const diff = -nums[a]
    for (let b = a + 1; nums.length - 1; b++) {
      if (b > a + 1 && nums[b] === nums[b - 1]) continue
      while (b < c && nums[b] + nums[c] > diff) c--
      if (b >= c) break
      if (nums[b] + nums[c] === diff) {
        ans.push([nums[a], nums[b], nums[c]])
      }
    }
  }
  return ans
}

/**
 三指针2 速度和方法一一样
 * @param {number[]} nums
 * @return {number[][]}
 */
export var threeSum2 = function (nums) {
  nums.sort((a, b) => a - b)
  const ans = []
  // a, b, c三个指针
  for (let a = 0; a < nums.length - 2; a++) {
    // 如果 nums[a] 和一个数相同。跳过以避免重复
    if (a > 0 && nums[a] === nums[a - 1]) continue
    let b = a + 1
    let c = nums.length - 1
    while (b < c) {
      // 找到了一个结果
      const sum = nums[a] + nums[b] + nums[c]
      if (sum === 0) {
        ans.push([nums[a], nums[b], nums[c]])
        // 找到一个后须要继续找下一个
        b++
        c--
        // 当下一个b与上一个b相同时，继续向后找
        while (nums[b] === nums[b - 1]) b++
      } else if (sum > 0) {
        c--
      } else {
        b++
      }
    }
  }
  return ans
}
